import NodosArbol


POper=[]
PVars=NodosArbol.Pila()
PRetornos=[]

def TipoInst(Inst):
    return Inst>>35

def Mask35(Inst):
    return Inst&16777215

def Mask20Entero(Inst):
    aux = (Inst >> 14) & 1048575
    a = Inst >> 34;
    if a == 1: 
        aux = -aux;
    return aux;
    

def Mask14(Inst):
    return Inst&16383

def Decimal(Inst):
    entero=Mask20Entero(Inst)
    decimal=Mask14(Inst)
    return float(str(entero)+"."+str(decimal))

def Ejecutar(ListaInst):
    global POper,PVars,PRetornos
    i=0
    PRetornos.append(len(ListaInst))
    while(i<len(ListaInst)):
        InstActual=int(ListaInst[i])
        tipo=TipoInst(InstActual)
        if tipo==34:
            while len(POper)!=0:
                POper.pop()
            i+=1
        elif tipo==0:
            aux=Mask35(InstActual)
            i+=1
            if PVars.containVar(aux):
                POper.append(PVars.getvalor(aux))
            else:
                print "Error Linea:%s"%i
        elif tipo==1:
            aux=Mask20Entero(InstActual)
            POper.append(NodosArbol.Variable(None, 0, aux))
            i+=1
        elif tipo==2:
            aux=Decimal(InstActual)
            POper.append(NodosArbol.Variable(None,1,aux))
            i+=1
        elif tipo==3:
            aux=Mask20Entero(InstActual)
            POper.append(NodosArbol.Variable(None,2,aux))
            i+=1
        elif tipo==4:
            aux=Mask35(InstActual)
            v=POper.pop()
            PVars.addVar(aux,v.tipo , v.valor)
            i+=1
        elif tipo in [5,6,7,8]:
            v1=POper.pop()
            v2=POper.pop()
            i+=1
            if v1.tipo in [0,1] and v2.tipo in [0,1]:
                if tipo==5:
                    aux=NodosArbol.Variable(None,None,v2.valor+v1.valor)
                if tipo==6:
                    aux=NodosArbol.Variable(None,None,v2.valor-v1.valor)
                if tipo==7:
                    aux=NodosArbol.Variable(None,None,v2.valor*v1.valor)
                if tipo==8:
                    if v1.valor != 0:
                        aux=NodosArbol.Variable(None,None,v2.valor/v1.valor)
                    else:
                        print "Error Division por cero"
                if v1.tipo==1 or v2.tipo==1:
                    aux.tipo=1
                else:
                    aux.tipo=0
                POper.append(aux)
            else:
                print "Error Linea:%s"%i
        elif tipo in[10,11,12,13]:
            v1=POper.pop()
            v2=POper.pop()
            i+=1
            if v1.tipo in [0,1] and v2.tipo in [0,1]:
                if tipo==10:
                    aux=NodosArbol.Variable(None,None,v2.valor<v1.valor)
                if tipo==11:
                    aux=NodosArbol.Variable(None,None,v2.valor>v1.valor)
                if tipo==12:
                    aux=NodosArbol.Variable(None,None,v2.valor<=v1.valor)
                if tipo==13:
                    aux=NodosArbol.Variable(None,None,v2.valor>=v1.valor)
                aux.tipo=2
                POper.append(aux)
            else:
                print "Error Linea:%s"%i
        elif tipo in [14,15]:
            v1=POper.pop()
            v2=POper.pop()
            i+=1
            aux=None
            if v1.tipo in [0,1] and v2.tipo in [0,1]:
                if tipo==14:
                    aux=NodosArbol.Variable(None,2,v2.valor == v1.valor)
                if tipo==15:
                    aux=NodosArbol.Variable(None,2,v2.valor != v1.valor)
            elif v1.tipo == 2 and v2.tipo == 2:
                if tipo==14:
                    aux=NodosArbol.Variable(None,2,v2.valor == v1.valor)
                if tipo==15:
                    aux=NodosArbol.Variable(None,2,v2.valor != v1.valor)
            else:
                print "Error de tipos"
            POper.append(aux)        
        elif tipo in [16,17]:
            v1=POper.pop()
            v2=POper.pop()
            i+=1
            if v1.tipo==2 and v2.tipo==2:
                if tipo==16:
                    aux=NodosArbol.Variable(None,2,v2.valor and v1.valor)
                if tipo==17:
                    aux=NodosArbol.Variable(None,2,v2.valor or v1.valor)
                POper.append(aux)
            else:
                print "Error Linea:%s"%i
        elif tipo == 9:
            v1=POper.pop()
            i+=1
            if v1.tipo == 0:
                aux=NodosArbol.Variable(None,0,-v1.valor)
                POper.append(aux)
            elif v1.tipo == 1:
                aux=NodosArbol.Variable(None,1,-v1.valor)
                POper.append(aux)
            else:
                print "Error Linea:%s"%i
        elif tipo == 18:
            v1=POper.pop()
            i+=1
            if v1.tipo == 2:
                aux=NodosArbol.Variable(None,2,not(v1.valor))
                POper.append(aux)
            else:
                print "Error Linea:%s"%i
        elif tipo == 19:
            v1=POper.pop()
            i+=1
            if v1.tipo == 2:
                if v1.valor==False:  #pendiente
                    i=Mask35(InstActual)
            else:
                print "Error Linea:%s"%i
        elif tipo == 20:
            i=Mask35(InstActual)    #pendiente
        elif tipo==21:
            PVars.reservarVars()
            PRetornos.append(i+1)
            i=Mask35(InstActual)    #pendiente
        elif tipo == 22:
            PVars.popVars()
            i=PRetornos.pop()
        elif tipo == 23:
            PVars.popVars()
            POper.append(NodosArbol.Variable(None,None,None))
            i=PRetornos.pop()
        elif tipo == 24:
            i+=1
        elif tipo in [25,26,27,28]:
            aux = POper.pop()
            if aux.tipo in [0,1]:
                print aux.valor
            else:
                print "error tipos"
            i+=1
        elif tipo == 29: 
            print "borrarpantalla"
            i+=1
        elif tipo == 30: 
            print "bajarpluma"
            i+=1
        elif tipo == 31: 
            print "subirpluma"
            i+=1
        elif tipo == 32: 
            aux = POper.pop()
            print aux.valor
            i+=1
        elif tipo== 33:
            PVars.popVars()
            i=PRetornos.pop()
#    PVars.imprimirVars()
      

        
